{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4 数据类型（二）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.合并两个列表并去重"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入两个列表alist和blist，要求列表中的每个元素都为正整数且不超过10；\n",
    "\n",
    "合并alist和blist，并将重复的元素去掉后输出一个新的列表clist。\n",
    "\n",
    "可以使用以下实现列表alist的输入：\n",
    "\n",
    "`alist=list(map(int,input().split()))`\n",
    "\n",
    "同时为保证输出结果一致，请将集合内元素排序之后再输出。\n",
    "\n",
    "如对于列表 `alist`，可输出 `sorted(alist)`。\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共两行，每一行都用来输入列表中的元素值，以空格隔开。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，以列表形式打印输出。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "1 2 3\n",
    "\n",
    "4 3 2\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "[1,2,3,4]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 1 2 3\n",
      " 4 3 2\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2, 3, 4]\n"
     ]
    }
   ],
   "source": [
    "alist = list(map(int, input().split()))  # map() 函数的应用\n",
    "blist = list(map(int, input().split()))\n",
    "\n",
    "alist = sorted(alist)\n",
    "blist = sorted(blist)\n",
    "\n",
    "# 利用集合的性质 —— 集合中的元素不重复性，来进行去重\n",
    "aset = set(alist)\n",
    "bset = set(blist)\n",
    "cset = aset | bset  # 取并集\n",
    "\n",
    "clist = list(cset)  # 转为输出样例的列表类型\n",
    "print(clist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.对列表元素进行分类后加标签存入字典"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入一个列表，要求列表中的每个元素都为正整数且列表包含的元素个数为偶数；\n",
    "\n",
    "将列表中前一半元素保存至字典的第一个键值1中，后一半元素保存至第二个键值2中。\n",
    "\n",
    "可以使用以下实现列表alist的输入：\n",
    "\n",
    "`alist=list(map(int,input().split()))`\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，列表中的元素值，以空格隔开。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，以字典的形式打印结果。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "1 2 3 4\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "{'1': [1,2], '2': [3,4]}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 1 2 3 4\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'1': [1, 2], '2': [3, 4]}\n"
     ]
    }
   ],
   "source": [
    "alist = list(map(int, input().split()))\n",
    "adict = {}\n",
    "\n",
    "middle_index = int(len(alist)/2)  # 注意索引值取整\n",
    "alist_prev = alist[0:middle_index]\n",
    "alist_next = alist[middle_index:]\n",
    "adict['1'] = alist_prev\n",
    "adict['2'] = alist_next\n",
    "# 还可以使用 .update() 方法\n",
    "\n",
    "print(adict)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.列表反转"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入一个列表，将其反转后输出新的列表。\n",
    "\n",
    "可以使用以下实现列表alist的输入：\n",
    "\n",
    "`alist=list(map(int,input().split()))`\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，列表中的元素值，以空格隔开。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个列表。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "1 2 3\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "[3, 2, 1]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " 1 2 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3, 2, 1]\n"
     ]
    }
   ],
   "source": [
    "alist = list(map(int, input().split()))\n",
    "alist_reverse = alist[::-1]  # 切片操作\n",
    "print(alist_reverse)\n",
    "\n",
    "# 也可以用 reverse() 方法，但要注意 reverse() 操作没有返回值\n",
    "# alist.reverse()  \n",
    "# print(alist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.列表元素绝对值排序"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "输入一个列表，要求列表中的每个元素都为整数；\n",
    "\n",
    "将列表中的所有元素按照它们的绝对值大小进行排序，绝对值相同的还保持原来的相对位置，打印排序后的列表（绝对值大小仅作为排序依据，打印出的列表中元素仍为原列表中的元素）。\n",
    "\n",
    "可以使用以下实现列表alist的输入：\n",
    "\n",
    "`alist=list(map(int,input().split()))`\n",
    "\n",
    "---\n",
    "\n",
    "**输入格式:**\n",
    "\n",
    "共一行，列表中的元素值，以空格隔开。\n",
    "\n",
    "**输出格式：**\n",
    "\n",
    "共一行，为一个列表。\n",
    "\n",
    "---\n",
    "\n",
    "**输入样例：**\n",
    "\n",
    "```\n",
    "-2 1 3\n",
    "```\n",
    "\n",
    "**输出样例：**\n",
    "\n",
    "```\n",
    "[1, -2, 3]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      " -2 1 3\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, -2, 3]\n"
     ]
    }
   ],
   "source": [
    "alist = list(map(int, input().split()))\n",
    "alist = sorted(alist, key=lambda x: abs(x))\n",
    "# 或 alist.sort(key=lambda x: abs(x))\n",
    "print(alist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**小结：**\n",
    "\n",
    "此题关键在于 `sorted()` 函数中的参数 `key`，可用 `lambda` 函数来指定排序的规则"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}